#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#define CRC8(crc, m)    (crc8_table[(crc) ^ (m)])
#define CRC8_START   0xFF
static const uint16_t crc8_table[256] = {
	0x00,0x07,0x0E,0x09,0x1C,0x1B,0x12,0x15,0x38,0x3F,0x36,0x31,0x24,0x23,0x2A,0x2D,
	0x70,0x77,0x7E,0x79,0x6C,0x6B,0x62,0x65,0x48,0x4F,0x46,0x41,0x54,0x53,0x5A,0x5D,
	0xE0,0xE7,0xEE,0xE9,0xFC,0xFB,0xF2,0xF5,0xD8,0xDF,0xD6,0xD1,0xC4,0xC3,0xCA,0xCD,
	0x90,0x97,0x9E,0x99,0x8C,0x8B,0x82,0x85,0xA8,0xAF,0xA6,0xA1,0xB4,0xB3,0xBA,0xBD,
	0xC7,0xC0,0xC9,0xCE,0xDB,0xDC,0xD5,0xD2,0xFF,0xF8,0xF1,0xF6,0xE3,0xE4,0xED,0xEA,
	0xB7,0xB0,0xB9,0xBE,0xAB,0xAC,0xA5,0xA2,0x8F,0x88,0x81,0x86,0x93,0x94,0x9D,0x9A,
	0x27,0x20,0x29,0x2E,0x3B,0x3C,0x35,0x32,0x1F,0x18,0x11,0x16,0x03,0x04,0x0D,0x0A,
	0x57,0x50,0x59,0x5E,0x4B,0x4C,0x45,0x42,0x6F,0x68,0x61,0x66,0x73,0x74,0x7D,0x7A,
	0x89,0x8E,0x87,0x80,0x95,0x92,0x9B,0x9C,0xB1,0xB6,0xBF,0xB8,0xAD,0xAA,0xA3,0xA4,
	0xF9,0xFE,0xF7,0xF0,0xE5,0xE2,0xEB,0xEC,0xC1,0xC6,0xCF,0xC8,0xDD,0xDA,0xD3,0xD4,
	0x69,0x6E,0x67,0x60,0x75,0x72,0x7B,0x7C,0x51,0x56,0x5F,0x58,0x4D,0x4A,0x43,0x44,
	0x19,0x1E,0x17,0x10,0x05,0x02,0x0B,0x0C,0x21,0x26,0x2F,0x28,0x3D,0x3A,0x33,0x34,
	0x4E,0x49,0x40,0x47,0x52,0x55,0x5C,0x5B,0x76,0x71,0x78,0x7F,0x6A,0x6D,0x64,0x63,
	0x3E,0x39,0x30,0x37,0x22,0x25,0x2C,0x2B,0x06,0x01,0x08,0x0F,0x1A,0x1D,0x14,0x13,
	0xAE,0xA9,0xA0,0xA7,0xB2,0xB5,0xBC,0xBB,0x96,0x91,0x98,0x9F,0x8A,0x8D,0x84,0x83,
	0xDE,0xD9,0xD0,0xD7,0xC2,0xC5,0xCC,0xCB,0xE6,0xE1,0xE8,0xEF,0xFA,0xFD,0xF4,0xF3,
};

char calc_crc8(uint8_t *buf, uint8_t length){
	uint8_t crc8;
	crc8 = CRC8_START;
	while(length--) {
		crc8 = CRC8(crc8, *buf);
		++buf;
	}
	return (char)crc8;
}

#define SN_MAXSIZE	7


uint16_t next_sn(uint16_t next)
{
	uint16_t t = 0;
	t = next + 1;
	return t;
}

uint64_t next_sn_64(uint64_t next)
{
	uint64_t t = 0;
	t = next + 1;
	return t;
}

void clac_lot_sn(uint8_t *sn,int num)
{
	uint16_t next = sn[5];
	next <<= 8;
	next |= sn[6];
	for(int i=0;i< num;i++){
		
		char crc8 = calc_crc8(sn+1,6);
		sn[0] = crc8;
		
		for(int i=0;i< SN_MAXSIZE;i++){
			//TODO
			printf_s("%02d",sn[i]);
		}
		printf("\n");
		next = next_sn(next);
		uint8_t data_h = (uint8_t)next >> 8;
		uint8_t data_l = (uint8_t)next & 0x00ff;
		sn[5] = data_h;
		sn[6] = data_l;

	}
}
int decimal_bcd_code(int decimal)//十进制转BCD码
{
	int sum = 0, i;//i计数变量，sum返回的BCD码
	for ( i = 0; decimal > 0; i++)
	{
		sum |= ((decimal % 10 ) << ( 4*i));
		decimal /= 10;
	}
	return sum;
}
int bcd_decimal_code(int decimal)
{
	return (decimal - (decimal>>4) * 6);
}

void clac_dec_sn(uint8_t *sn,int count)
{
	FILE *p;
	p = fopen("sn.txt","w");
	char buf[20];
	uint64_t next = 0;//0000
	next = (sn[3] / 16 * 10 + sn[3]  % 16) * 1000000;
	next += (sn[4] / 16 * 10 + sn[4] % 16) * 10000;
	next += (sn[5] / 16 * 10 + sn[5] % 16) * 100;
	next += (sn[6] / 16 * 10 + sn[6] % 16) ;
//	printf("next = %08lld\n",next);
	for(int i=0;i< count;i++){
		
		char crc8 = calc_crc8(sn + 1,6);
		sn[0] = crc8;
		sprintf(buf + 0,"'");
		for(int i = 0;i < 7;i++){
			sprintf(buf + i*2 +1,"%02X",sn[i]);
			printf_s("%02X",sn[i]);
		}
		sprintf(buf + 15,"\r\n");
		fputs(buf,p);
		printf("\n");
		next = next_sn_64(next);
		sn[3] = (next / 1000000) /10 * 16 + (next / 1000000) % 10 ;
//		printf("3:0x%02x\n",sn[3]);
		sn[4] = (next / 10000 % 100) /10 * 16 +  (next / 10000 %  10);
//		printf("4:0x%02x\n",sn[4]);
		sn[5] = ((next / 100 % 100) ) /10 * 16 + (next / 100  % 10 );
//		printf("5:0x%02x\n",sn[5]);
		sn[6] = (next % 100) /10 *16 + next % 10 ;
		
//		printf("6:0x%02x\n",sn[6]);
	}
}

int main()
{
	uint8_t sn[] = {0x0,0x22,0x24,0x00,0x00,0x00,0x01};
	
	
//	clac_lot_sn(sn,10);
	clac_dec_sn(sn,2000);
	
	return 0;
}
